import logging

# -*- coding:utf-8 -*-
"""
作者：Administrator
日期：2021年03月19日
"""

# 函数方法 要么把日志生成在控制台，要么在文本里面。还需要改底层代码 加 coding=utf-8
# 四大组件的方法 日志信息可同时在控制台和文本里生成
"""
日志器 logger
处理器 handler    文本or控制台
格式器 formatter
"""


class LogTools:
    def __init__(self, file_path=None):
        self.file_path = file_path

    # 关系：一个日志器——对应多个处理器（输出到控制台，输出到文本）;一个处理器对应一个格式器;
    def formatter(self, fmt="%(asctime)s %(levelname)s %(filename)s %(funcName)s %(message)s"):
        """
        创建格式器，默认为：时间 文件名 方法名 信息 bug等级
        :return: 格式器formatter
        """
        # 创建格式器
        formatter = logging.Formatter(fmt=fmt)
        return formatter

    def handler(self):
        """
        创建一个处理器,默认创建处理器输出到控制台
        filepath: 默认输出到控制台
        :return: 处理器handler
        """
        try:
            if self.file_path is not None:
                # 创建处理器，文件中
                handler = logging.FileHandler(self.file_path, encoding='utf-8')
            else:
                # 创建处理器，控制台
                handler = logging.StreamHandler()
            # 格式器传入处理器
            handler.setFormatter(self.formatter())
            return handler
        except Exception as e:
            print('创建处理器失败', e)

    def logger(self, log_type, text):
        """
        创建一个日志器，并设定展示级别和放入处理器
        filepath: 日志文件保存地址，默认为："../conf/config.yaml"文件中配置的logpath路径
        :return: 日志器
        :case: lt.logger().info('正确计算{}+{}'.format(a, b))
        """
        # 创建一个日志器
        logger = logging.getLogger('logger')
        # 设置日志级别
        logger.setLevel(logging.DEBUG)
        # 把处理器加载到日志
        handler = self.handler()
        logger.addHandler(handler)
        getattr(logger, log_type)(text)
        logger.removeHandler(handler)


if __name__ == "__main__":
    # 日志类实例化
    lg = LogTools('../log/log01.log')


    def test01(a, b):
        try:
            sum = a + b
            lg.logger().info('正确计算{}+{}'.format(a, b))
            return sum
        except Exception:
            lg.logger().error('错误计算{}+{}'.format(a, b))


    print(test01('aa', 11))
